/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.app.dto.SkuDto;
import com.yami.shop.bean.model.Sku;
import com.yami.shop.bean.model.StockBillLog;
import com.yami.shop.bean.model.StockBillLogItem;
import com.yami.shop.bean.param.ProductParam;
import com.yami.shop.bean.param.SkuPriceParam;
import com.yami.shop.common.util.PageParam;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 *
 * @author lgh on 2018/09/29.
 */
public interface SkuService extends IService<Sku> {

    /**
     * 根据商品id获取商品中的sku列表（将会被缓存起来）(如果不需要sku库存信息，就使用该接口)
     * 注意：该接口只有sku和sku国际化信息，不包含sku库存信息
     * @param prodId 商品id
     * @param dbLang
     * @return sku列表
     */
    List<Sku> listByProdId(Long prodId, Integer dbLang);

    /**
     * 获取sku、sku国际化、sku库存信息列表
     *
     * @param prodId 商品id
     * @param lang
     * @return sku列表
     */
    List<Sku> listSkuAndSkuStock(Long prodId, Integer lang);

    /**
     * 获取启用的sku、sku国际化、sku库存信息列表 （只获取启动状态的sku，不包含禁用的sku）
     * 在listSkuAndSkuStock() 的基础上过滤掉禁用的sku
     * @param prodId 商品id
     * @param lang
     * @return sku列表
     */
    List<Sku> listPutOnSkuAndSkuStock(Long prodId, Integer lang);

    /**
     * 根据skuId获取sku及库存信息（将会被缓存起来）
     * @param skuId shuId
     * @param dbLang 语言类型
     * @return
     */
    Sku getSkuBySkuId(Long skuId, Integer dbLang);

    /**
     * 根据skuId列表查找库存信息，赠品使用无缓存
     * @param skuIds
     * @return
     */
    List<Sku> getSkuBySkuIds(List<Long> skuIds);

    /**
     * 根据id获取sku语言列表 TODO
     * @param skuId
     * @return
     */
    Sku getSkuListBySkuId( Long skuId);

    /**
     * 删除sku的缓存（包含sku、sku列表、sku库存的缓存）
     *
     * @param skuId skuId
     * @param prodId 商品id
     */
    void removeSkuCacheBySkuId(Long skuId, Long prodId);

    /**
     * 删除sku库存的缓存（包含sku、sku库存的缓存）
     * @param prodId 商品id
     */
    void removeSkuStockCache(Long skuId, Long prodId);

    /**
     * 更新sku
     * @param sku sku
     */
    void updateSku(Sku sku);

    /**
     * 批量保存sku、sku语言和sku库存表
     * @param skuList sku列表
     */
    void insertBatchAndLang(List<Sku> skuList);

    /**
     * 分页获取sku
     * @param page
     * @param product
     * @return
     */
    IPage<Sku> pageSku(PageParam<Sku> page, ProductParam product);

    /**
     * 根据商品id列表获取有商品编号的
     * @param prodIds 获取商品编号的商品id列表
     * @param disProdId  过滤掉的商品
     * @return
     */
    List<String> listSkuByProdIds(List<Long> prodIds,Long disProdId);

    /**
     * 根据编码获取sku信息(sku、商品名称、sku库存信息)
     * @param shopId
     * @param partyCode
     * @return
     */
    Sku getSkuByShopIdAndPartyCode(Long shopId, String partyCode);

    /**
     * 查询库存
     * @param page
     * @param productParam
     * @return
     */
    IPage<StockBillLogItem> inquireStock(PageParam<StockBillLog> page, ProductParam productParam);

    /**
     * 导出sku信息
     * @param product
     * @param response
     */
    void exportSkuList(ProductParam product, HttpServletResponse response);

    /**
     * 更新库存
     * @param sku
     * @return
     */
    int updateStocks(Sku sku);

    /**
     * 获取指定商品的sku列表（包括sku库存信息等）（仅获取启用状态）
     * @param prodId
     * @return
     */
    List<SkuDto> getProdDetailSkuInfo(Long prodId);

    /**
     * 更新sku缓存
     * @param skuId
     * @param stocks
     * @return
     */
    int updateSkuStocks(Long skuId, Integer stocks);

    /**
     * 根据商品id和团购价格获取对应sku的原价
     * @param prodId
     * @param actPrice
     * @return
     */
    Sku getSkuOriPriceByProdIdAndActPrice( Long prodId,Double actPrice);

    /**
     * 或者指定的sku列表
     * @param skuIds
     * @return
     */
    List<Sku> listSkuBySKuIds(List<Long> skuIds);

    @Transactional
    void updateOriPrice(List<SkuPriceParam> priceParams);
}
